const auth = require('../../utils/auth')
const { get, post } = require('../../utils/request')

Page({
  data: {
    // 登录/注册模式
    isRegisterMode: false,

    // 登录类型: password-账号密码登录, email-邮箱验证码登录
    loginType: 'password',

    // 账号密码登录字段
    username: '',
    password: '',

    // 邮箱登录字段
    email: '',
    code: '',
    codeButtonDisabled: false,
    codeButtonText: '获取验证码',
    countdown: 60,

    // 注册字段
    registerUsername: '',
    registerPassword: '',
    registerPasswordConfirm: '',

    // 用户角色
    userRole: 'user' // 默认用户角色
  },

  onLoad() {
    // 页面加载时的初始化操作
  },

  // 切换到注册模式
  switchToRegister() {
    this.setData({
      isRegisterMode: true,
      registerUsername: '',
      registerPassword: '',
      registerPasswordConfirm: ''
    })
  },

  // 切换到登录模式
  switchToLogin() {
    this.setData({
      isRegisterMode: false
    })
  },

  // 切换登录方式
  switchLoginType(e) {
    const type = e.currentTarget.dataset.type
    this.setData({
      loginType: type
    })
  },

  // 角色选择变更
  onRoleChange(e) {
    this.setData({
      userRole: e.detail.value
    })
  },

  // 输入用户名
  inputUsername(e) {
    this.setData({
      username: e.detail.value
    })
  },

  // 输入密码
  inputPassword(e) {
    this.setData({
      password: e.detail.value
    })
  },

  // 输入邮箱
  inputEmail(e) {
    this.setData({
      email: e.detail.value
    })
  },

  // 输入验证码
  inputCode(e) {
    this.setData({
      code: e.detail.value
    })
  },

  // 输入注册用户名
  inputRegisterUsername(e) {
    this.setData({
      registerUsername: e.detail.value
    })
  },

  // 输入注册密码
  inputRegisterPassword(e) {
    this.setData({
      registerPassword: e.detail.value
    })
  },

  // 输入确认密码
  inputRegisterPasswordConfirm(e) {
    this.setData({
      registerPasswordConfirm: e.detail.value
    })
  },

  // 获取邮箱验证码
  getEmailCode() {
    const { email } = this.data

    // 验证邮箱格式
    if (!email) {
      wx.showToast({
        title: '请输入邮箱',
        icon: 'none'
      })
      return
    }

    const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
    if (!emailRegex.test(email)) {
      wx.showToast({
        title: '邮箱格式不正确',
        icon: 'none'
      })
      return
    }

    // 禁用按钮，开始倒计时
    this.setData({
      codeButtonDisabled: true
    })

    // 调用获取验证码接口
    get('/api/user/login/email', { email }).then(res => {
      if (res.code === 0 && res.data) {
        wx.showToast({
          title: '验证码已发送',
          icon: 'success'
        })

        // 开始倒计时
        this.startCodeCountdown()
      } else {
        this.setData({
          codeButtonDisabled: false
        })
        wx.showToast({
          title: res.message || '获取验证码失败',
          icon: 'none'
        })
      }
    }).catch(err => {
      this.setData({
        codeButtonDisabled: false
      })
      wx.showToast({
        title: err.message || '获取验证码失败',
        icon: 'none'
      })
    })
  },

  // 验证码倒计时
  startCodeCountdown() {
    let countdown = this.data.countdown

    const timer = setInterval(() => {
      countdown--

      if (countdown <= 0) {
        clearInterval(timer)
        this.setData({
          codeButtonDisabled: false,
          codeButtonText: '获取验证码',
          countdown: 60
        })
      } else {
        this.setData({
          codeButtonText: `${countdown}秒后重试`,
          countdown
        })
      }
    }, 1000)
  },

  // 注册账号
  register() {
    const { registerUsername, registerPassword, registerPasswordConfirm } = this.data

    // 验证输入
    if (!registerUsername) {
      wx.showToast({
        title: '请输入用户名',
        icon: 'none'
      })
      return
    }

    if (!registerPassword) {
      wx.showToast({
        title: '请输入密码',
        icon: 'none'
      })
      return
    }

    if (registerPassword.length < 6) {
      wx.showToast({
        title: '密码长度不能少于6位',
        icon: 'none'
      })
      return
    }

    if (registerPassword !== registerPasswordConfirm) {
      wx.showToast({
        title: '两次密码输入不一致',
        icon: 'none'
      })
      return
    }

    wx.showLoading({
      title: '注册中...',
      mask: true
    })

    // 调用注册接口
    post('/api/user/register', {
      username: registerUsername,
      password: registerPassword,
      checkPassword: registerPasswordConfirm
    }).then(res => {
      wx.hideLoading()

      if (res.code === 0 && res.data) {
        wx.showToast({
          title: '注册成功',
          icon: 'success'
        })

        // 填充登录表单并切换到登录模式
        this.setData({
          isRegisterMode: false,
          loginType: 'password',
          username: registerUsername,
          password: registerPassword
        })
      } else {
        wx.showToast({
          title: res.message || '注册失败',
          icon: 'none'
        })
      }
    }).catch(err => {
      wx.hideLoading()
      wx.showToast({
        title: err.message || '注册失败',
        icon: 'none'
      })
    })
  },

  // 账号密码登录
  login() {
    const { username, password, userRole } = this.data

    if (!username) {
      wx.showToast({
        title: '请输入用户名',
        icon: 'none'
      })
      return
    }

    if (!password) {
      wx.showToast({
        title: '请输入密码',
        icon: 'none'
      })
      return
    }

    wx.showLoading({
      title: '登录中...',
      mask: true
    })

    // 调用登录接口
    const loginUrl = '/api/user/login'
    post(loginUrl, { username, password }).then(res => {
      if (res.code === 0 && res.data) {
        // 设置Token (接口返回的data即为JWT token)
        auth.setToken(res.data)

        // 获取用户信息（包括角色）
        this.getUserInfo()
      } else {
        wx.hideLoading()
        wx.showToast({
          title: res.message || '登录失败',
          icon: 'none'
        })
      }
    }).catch(err => {
      wx.hideLoading()
      wx.showToast({
        title: err.message || '登录失败',
        icon: 'none'
      })
    })
  },

  // 邮箱验证码登录
  loginByEmail() {
    const { email, code, userRole } = this.data

    // 验证输入
    if (!email) {
      wx.showToast({
        title: '请输入邮箱',
        icon: 'none'
      })
      return
    }

    const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
    if (!emailRegex.test(email)) {
      wx.showToast({
        title: '邮箱格式不正确',
        icon: 'none'
      })
      return
    }

    if (!code) {
      wx.showToast({
        title: '请输入验证码',
        icon: 'none'
      })
      return
    }

    wx.showLoading({
      title: '登录中...',
      mask: true
    })

    // 调用邮箱登录接口
    post('/api/user/login/email', {
      email,
      code
    }).then(res => {
      if (res.code === 0 && res.data) {
        // 设置Token
        auth.setToken(res.data)

        // 获取用户信息
        this.getUserInfo()
      } else {
        wx.hideLoading()
        wx.showToast({
          title: res.message || '登录失败',
          icon: 'none'
        })
      }
    }).catch(err => {
      wx.hideLoading()
      wx.showToast({
        title: err.message || '登录失败',
        icon: 'none'
      })
    })
  },

  // 获取用户信息（包括角色）
  getUserInfo() {
    // 调用获取用户信息接口
    get('/api/user/get/login').then(res => {
      wx.hideLoading()

      if (res.code === 0 && res.data) {
        // 设置用户信息个体
        auth.setUserInfo(res.data)

        // 设置用户角色（从接口返回数据中获取）
        const role = res.data.role || 'user'
        auth.setUserRole(role)

        wx.showToast({
          title: '登录成功',
          icon: 'success'
        })

        // 登录成功后处理
        this.handleLoginSuccess()
      } else {
        wx.showToast({
          title: res.message || '获取用户信息失败',
          icon: 'none'
        })
        auth.clearLoginInfo() // 清除登录信息
      }
    }).catch(err => {
      wx.hideLoading()
      wx.showToast({
        title: err.message || '获取用户信息失败',
        icon: 'none'
      })
      auth.clearLoginInfo() // 清除登录信息
    })
  },

  // 登录成功后的处理
  handleLoginSuccess() {
    setTimeout(() => {
      // 获取页面栈
      const pages = getCurrentPages()

      if (pages.length > 1) {
        // 如果有上一页，返回上一页
        wx.navigateBack()
      } else {
        // 没有上一页，跳转到首页
        wx.switchTab({
          url: '/pages/index/index'
        })
      }
    }, 1500)
  }
}) 